home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1993-12-11 | 10.0 KB | 413 lines |
- IMPLEMENTATION MODULE FormTool;
-
- (*
- Form Tools.
-
- UK __DATE__ __TIME__
- *)
-
- (*IMP_SWITCHES*)
-
- FROM AES IMPORT Key,Root,Nil,ObjectIndex,ObjectPtr,
- TreePtr,TreeIndex,ObjectFlags,ObjectFlag,Outlined,
- StringRange,Global;
- FROM EvntMgr IMPORT Events,Event,MEvent,EvntEvent;
- FROM ObjcMgr IMPORT MaxDepth,ObjcFind,ObjcEdit,EditModes;
- FROM FormMgr IMPORT FormAlert,FormKeybd,FormButton;
- FROM GrafMgr IMPORT GrafMKState,MouseButton,MBLeft,SpecialKey,
- GrafMouse,MOn,MOff,GrafHandle;
- FROM RsrcMgr IMPORT RTree,RString,RsrcGAddr;
- FROM WindMgr IMPORT Desk;
- FROM RcMgr IMPORT GRect,GPnt,RcConstrain;
- FROM VDI IMPORT XY;
- FROM VRaster IMPORT MFDB,SOnly,VROCpyFm;
- FROM VScreen IMPORT VSound;
- FROM ObjcTool IMPORT EXCLObjectFlags,INCLObjectFlags,ObjectXYWH;
- FROM WindTool IMPORT BeginMouseControl,EndMouseControl,GetWorkXYWH;
- FROM PORTAB IMPORT SIGNEDWORD,UNSIGNEDWORD,WORDSET,NULL,ANYPOINTER;
- FROM INTRINSIC IMPORT VOID;
- FROM pSTORAGE IMPORT ALLOCATE,DEALLOCATE,SIZETYPE;
- CAST_IMPORT
-
- IMPORT FormMgr,GetObject,SetObject;
-
- PROCEDURE DoAlert(DefBut : UNSIGNEDWORD;
- AlertNo: TreeIndex): UNSIGNEDWORD;
-
- VAR AlertAddr: ANYPOINTER;
-
- BEGIN
- IF RsrcGAddr(RString,AlertNo,AlertAddr) THEN
- RETURN FormAlert(DefBut,AlertAddr);
- ELSE
- RETURN 65535;
- END;
- END DoAlert;
-
- PROCEDURE Alert(AlertNo: TreeIndex);
- BEGIN
- VOID(DoAlert(1,AlertNo));
- END Alert;
-
- PROCEDURE OK(AlertNo: TreeIndex): BOOLEAN;
- BEGIN
- RETURN DoAlert(1,AlertNo) = 1;
- END OK;
-
- VAR Buffer: ANYPOINTER;
-
- PROCEDURE FormDial( Dial: FormDials;
- VAR From: GRect;
- VAR To : GRect);
-
- CONST WordWidth = 16; (* Wordbreite in Bits *)
- BytesPerWord = 2;
-
- VAR Size : SIZETYPE;
- WdWidth : XY; (* Wordbreite *)
- PixPos : XY; (* Pixelposition *)
- PXY : ARRAY[0..7] OF XY;
- SrcMFDB : MFDB;
- DstMFDB : MFDB;
- Work : GRect;
- AESHandle: UNSIGNEDWORD;
- D : UNSIGNEDWORD;
-
- BEGIN
- GetWorkXYWH(Desk,Work);
- #ifdef TDIM2
- (* damned, why this exception for TDI? *)
- WITH To DO
- IF (
- LONG(
- CARDINAL(
- (GW DIV WordWidth + 2) * GH
- )
- )
- > MAX(SIZETYPE) DIV LONG(Global.ApNPlanes)
- ) OR
- (GH > Work.GH) OR
- (GW > Work.GW) THEN
- FormMgr.formdial(Dial,From,To);
- RETURN;
- END;
-
- Size:= LONG((GW DIV WordWidth + 2) * GH * INT(Global.ApNPlanes) * BytesPerWord);
- #else
- WITH To DO
- IF (VAL(SIZETYPE,(GW DIV WordWidth + 2) * GH) >
- MAX(SIZETYPE) DIV VAL(SIZETYPE,Global.ApNPlanes)) OR
- (GH > Work.GH) OR
- (GW > Work.GW) THEN
- FormMgr.formdial(Dial,From,To);
- RETURN;
- END;
-
- Size:= (GW DIV WordWidth + 2) * GH * INT(Global.ApNPlanes) * BytesPerWord;
- #endif
-
- (*
- WITH To DO
- IF (VAL(CARDINAL,(GW DIV WordWidth + 2) * GH) >
- MAX(SIZETYPE) DIV VAL(CARDINAL,Global.ApNPlanes)) OR
- (GH > Work.GH) OR
- (GW > Work.GW) THEN
- FormMgr.formdial(Dial,From,To);
- RETURN;
- END;
-
- Size:= (GW DIV WordWidth + 2) * GH * INT(Global.ApNPlanes) * BytesPerWord;
- *)
-
- WdWidth:= GW DIV WordWidth;
- PixPos:= GX MOD WordWidth;
-
- SrcMFDB.FDAddr:= NULL;
-
- WITH DstMFDB DO
- FDW:= GW;
- FDH:= GH;
- FDWdWidth:= WdWidth + 2;
- FDStand:= FALSE;
- FDNPlanes:= Global.ApNPlanes;
- END;
-
- AESHandle:= GrafHandle(D,D,D,D);
-
- CASE Dial OF
- FormMgr.FmDStart:
- ALLOCATE(Buffer,Size);
- IF Buffer # NIL THEN
- DstMFDB.FDAddr:= Buffer;
- PXY[0]:= GX;
- PXY[1]:= GY;
- PXY[2]:= GX + GW - 1;
- PXY[3]:= GY + GH - 1;
- PXY[4]:= PixPos;
- PXY[5]:= 0;
- PXY[6]:= GW + INT(PixPos) - 1;
- PXY[7]:= GH - 1;
-
- GrafMouse(MOff,NULL);
- VROCpyFm(AESHandle,SOnly,PXY,SrcMFDB,DstMFDB);
- GrafMouse(MOn,NULL);
- ELSE
- FormMgr.formdial(FormMgr.FmDStart,From,To);
- END;
- | FormMgr.FmDFinish:
- IF Buffer # NIL THEN
- DstMFDB.FDAddr:= Buffer;
- PXY[0]:= PixPos;
- PXY[1]:= 0;
- PXY[2]:= GW + INT(PixPos) - 1;
- PXY[3]:= GH - 1;
- PXY[4]:= GX;
- PXY[5]:= GY;
- PXY[6]:= GX + GW - 1;
- PXY[7]:= GY + GH - 1;
-
- GrafMouse(MOff,NULL);
- VROCpyFm(AESHandle,SOnly,PXY,DstMFDB,SrcMFDB);
- GrafMouse(MOn,NULL);
- DEALLOCATE(Buffer,Size);
- ELSE
- FormMgr.formdial(FormMgr.FmDFinish,From,To);
- END;
- ELSE
- FormMgr.formdial(Dial,From,To);
- END;
- END;
- END FormDial;
-
- PROCEDURE FormCenter( Tree: TreePtr;
- VAR Rect: GRect);
-
- CONST Margin = 3; (* documented by Tim Oren *)
-
- VAR Work : GRect;
- Pnt : GPnt;
- MouseState: MouseButton;
- KeyState : SpecialKey;
-
- BEGIN
- IF (GetObject.X(Tree,Root) = 0) AND (GetObject.Y(Tree,Root) = 0) THEN
- FormMgr.formcenter(Tree,Rect);
- GrafMKState(Pnt,MouseState,KeyState);
- WITH Pnt DO
- Rect.GX:= GX;
- Rect.GY:= GY;
- GetWorkXYWH(Desk,Work);
- RcConstrain(Work,Rect);
- GX:= Rect.GX + Margin;
- GY:= Rect.GY + Margin;
- END;
- SetObject.Pnt(Tree,Root,Pnt);
- ELSE
- GetObject.Rect(Tree,Root,Rect);
- WITH Rect DO
- DEC(GX,Margin);
- DEC(GY,Margin);
- INC(GW,2 * Margin);
- INC(GH,2 * Margin);
- END;
- END;
- END FormCenter;
-
- PROCEDURE FormDo(Tree : TreePtr;
- Start: ObjectIndex): SIGNEDWORD;
-
- CONST LastEdit = Flag15;
-
- TYPE Directions = (FmDDeflt,FmDForward,FmDBackward);
-
- VAR Index : StringRange;
- EditOb : ObjectPtr;
- NextOb : ObjectPtr;
- Cont : BOOLEAN;
- EventRec: MEvent;
- MyEvent : Event;
- D : UNSIGNEDWORD;
-
- PROCEDURE FindObject(Tree : TreePtr;
- Start : ObjectPtr;
- Flag : ObjectFlags;
- Direct : Directions): ObjectIndex;
-
- VAR Index : ObjectPtr;
- ObFlag: ObjectFlag;
- I : ObjectPtr;
-
- BEGIN
- Index:= Root;
- I:= 1;
-
- CASE Direct OF
- FmDBackward:
- I:= Nil;
- Index:= Start + I;
- | FmDForward:
- Index:= Start + I;
- | FmDDeflt:
- Flag:= Default;
- END;
-
- WHILE Index >= Root DO
- ObFlag:= GetObject.Flags(Tree,Index);
- IF Flag IN ObFlag THEN
- RETURN Index;
- END;
- IF LastOb IN ObFlag THEN
- Index:= Nil;
- ELSE
- Index:= Index + I;
- END;
- END;
- RETURN Start;
- END FindObject;
-
- PROCEDURE FirstObject(Tree : TreePtr;
- Start: ObjectIndex): ObjectIndex;
- VAR Last: ObjectIndex;
-
- BEGIN
- IF Start = 0 THEN
- Last:= FindObject(Tree,Root,LastEdit,FmDForward);
- IF Last = Root THEN
- RETURN FindObject(Tree,Root,Editable,FmDForward);
- ELSE
- RETURN Last;
- END;
- ELSE
- RETURN Start;
- END;
- END FirstObject;
-
- BEGIN
- BeginMouseControl;
-
- NextOb:= FirstObject(Tree,Start);
- EditOb:= 0;
- Cont:= TRUE;
-
- WHILE Cont DO
- WITH EventRec DO
- IF (NextOb # Root) AND (EditOb # NextOb) THEN
- EditOb:= NextOb;
- NextOb:= Root;
- ObjcEdit(Tree,EditOb,EKR,Index,EdInit);
- EXCLObjectFlags(Tree,EditOb,LastEdit);
- END;
-
- EFlags:= Event{MuKeybd,MuButton};
- EBClk:= 2;
- EBMsk:= MouseButton{MBLeft};
- EBSt:= MouseButton{MBLeft};
-
- MyEvent:= EvntEvent(EventRec);
-
- IF MuKeybd IN MyEvent THEN
- Cont:= FormKeybd(Tree,EditOb,NextOb,EKR,NextOb,EKR);
- #if packing
- IF EKR.ScanCode > 0 THEN
- #else
- IF EKR > 0 THEN
- #endif
- ObjcEdit(Tree,EditOb,EKR,Index,EdChar);
- END;
- END;
-
- IF MuButton IN MyEvent THEN
- NextOb:= ObjcFind(Tree,Root,MaxDepth,EMXY);
- IF NextOb = Nil THEN
- VSound(GrafHandle(D,D,D,D),550,3); (* works fine with A∙B∙C-GEM and NVDI *)
- NextOb:= Root;
- ELSE
- Cont:= FormButton(Tree,NextOb,EBR,NextOb);
- END;
- END;
-
- IF (NOT Cont) OR ((NextOb # Root) AND (NextOb # EditOb)) THEN
- ObjcEdit(Tree,EditOb,EKR,Index,EdEnd);
- END;
-
- END;
- END;
-
- INCLObjectFlags(Tree,EditOb,LastEdit);
-
- EndMouseControl;
-
- RETURN NextOb;
- END FormDo;
-
- PROCEDURE Mask(RetOb: SIGNEDWORD): ObjectIndex;
- BEGIN
- #ifdef FTLM2
- RETURN CAST(ObjectIndex,CAST(WORDSET,RetOb) - WORDSET{0});
- #else
- RETURN CAST(ObjectIndex,CAST(WORDSET,RetOb) - WORDSET{15});
- #endif
- END Mask;
-
- PROCEDURE DoubleClicked(VAR RetOb: SIGNEDWORD): BOOLEAN;
-
- VAR DoubleClick: BOOLEAN;
-
- BEGIN
- DoubleClick:= RetOb < 0;
- #ifdef FTLM2
- RetOb:= CAST(SIGNEDWORD,CAST(WORDSET,RetOb) - WORDSET{0);
- #else
- RetOb:= CAST(SIGNEDWORD,CAST(WORDSET,RetOb) - WORDSET{15});
- #endif
- RETURN DoubleClick;
- END DoubleClicked;
-
- (*
- TYPE FormProc = PROCEDURE(TreePtr,ObjectIndex): ObjectIndex;
-
- PROCEDURE InstallFormProc(Proc: FormProc);
-
- PROCEDURE StandardForm( Caller : ObjectIndex;
- TreeNo : ObjectIndex;
- VAR StartOb: ObjectIndex): ObjectIndex;
- *)
-
- (*
- PROCEDURE DoForm(VAR StartOb: ObjectIndex;
- Proc : FormProc;
- TreeNo : TreeIndex;
- Caller : ObjectIndex): ObjectIndex;
-
- VAR CallerTree: TreePtr;
- Tree : TreePtr;
- From : GRect;
- To : GRect;
- RetObj : SIGNEDWORD;
-
- BEGIN
- BeginUpdate;
- FormCenter(Tree,To);
- FormDial(FmDStart,To,To);
- IF Caller # Nil THEN
- RsrcGAddr(RTree,TreeNo,CallerTree);
- ObjcXYWH(CallerTree,Caller,From);
- ELSE
- XYWHToGRect(0,0,0,0,From);
- END;
-
- FormDial(FmDGrow,From,To);
- ObjcDraw(Tree,Root,MaxDepth,To);
- RetObj:= Proc(Tree,StartOb);
- ExclObjcState(Tree,RetObj,Selected);
- FormDial(FmDShrink,From,To);
- FormDial(FmDFinish,To,To);
- EndUpdate;
- RETURN RetObj;
- END StandardForm;
- *)
- BEGIN
- Buffer:= NIL;
- END FormTool.
-
-